<?php

/**
 * Sunny软件公司正在开发一款RPG网游，为了给玩家提供更多方便，
 * 在游戏过程中可以设置一个恢复点，用于保存当前的游戏场景，
 * 如果在后续游戏过程中玩家角色“不幸牺牲”，可以返回到先前保存的场景，
 * 从所设恢复点开始重新游戏。试使用备忘录模式设计该功能。
 */

/**
 * 原发器
 */
class Game
{
	private $_scene;
	
	public function setScene($scene)
	{
		$this->_scene = $scene;
		echo "进入游戏场景：{$scene}<br/>";
	}
	
	public function getScene()
	{
		return $this->_scene;
	}
	
	/**
	 * 返回当前游戏场景
	 */
	public function saveScene()
	{
		return new GameMemento($this);
	}
	
	/**
	 * 恢复指定的游戏场景
	 */
	public function restoreScene(GameMemento $game)
	{
		$this->_scene = $game->getScene();
		echo "恢复到游戏场景：{$game->getScene()}<br/>";
	}
}

/**
 * 备忘录
 */
class GameMemento
{
	private $_scene;
	
	public function __construct(Game $game)
	{
		$this->_scene = $game->getScene();
	}
	
	public function setScene($scene)
	{
		$this->_scene = $scene;
	}
	
	public function getScene()
	{
		return $this->_scene;
	}
}

/**
 * 负责人
 */
class MementoCaretaker
{
	private $_memento;
	
	public function setMemento(GameMemento $memento)
	{
		$this->_memento = $memento;
		echo "---保存游戏场景：{$memento->getScene()}<br/>";
	}
	
	public function getMemento()
	{
		return $this->_memento;
	}
}

class Client
{
	public static function main()
	{
		//负责保存游戏场景
		$caretaker = new MementoCaretaker();
		
		$game = new Game();
		$game->setScene('场景1');
		$caretaker->setMemento($game->saveScene());
		
		$game->setScene('场景2');
		
		$game->setScene('场景3');
		$caretaker->setMemento($game->saveScene());
		
		echo '---恢复游戏场景---<br/>';
		$game->restoreScene($caretaker->getMemento());
	}
}

Client::main();